package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * Java的值传递
 * @date : 2024-06-21 下午1:02
 */

public class P073_PassByValue {

    public static void main(String[] args) {
        passByValue();
    }


    private void passByValueWithList() {
        List<Person> personList = new ArrayList<>();
        Person person = new Person("张三", 20);
        personList.add(person);
        System.out.println("personList = " + personList);
        person.setName("李四");
        person.setAge(22);
        personList.add(person);
        System.out.println("personList = " + personList);
    }

    @Data
    @AllArgsConstructor
    public static class Person {
        private String name;
        private int age;
    }


    public static void passByValue() {
        int primitive = 10;
        Integer object = 10;

        // 基本数据类型的值传递
        changePrimitive(primitive);
        System.out.println("原始基本数据类型值: " + primitive); // 输出: 原始基本数据类型值: 10

        // 对象引用的值传递
        changeObject(object);
        System.out.println("原始对象引用值: " + object); // 输出: 原始对象引用值: 10（但对象的内容可能已被修改）

        // 尝试改变引用的指向（这是不可能的）
        changeObjectReference(object);
        System.out.println("原始对象引用是否改变: " + (object == 100)); // 输出: 原始对象引用是否改变: false
    }

    public static void changePrimitive(int num) {
        num = 20; // 修改副本，对原始变量无影响
    }

    public static void changeObject(Integer num) {
        num = 20; // 修改引用副本的指向，但原始引用仍指向原始对象
        // 但如果修改对象的内部状态（如num.someMethod()），则会影响原始对象
    }

    public static void changeObjectReference(Integer num) {
        num = 100; // 修改引用副本的指向，但原始引用仍指向原始对象
    }
}
